﻿using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Repositorios;
using Onshi.POS.Ubicaciones.Vistas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Onshi.POS.Ubicaciones
{
    public class BarriosPresentador
    {
        #region Constructores

        public BarriosPresentador(IBarrios vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IBarrios vista;
        private List<Barrio> listado;

        #endregion

        #region Propiedades

        private RepositorioEventos RepositorioEventos
        {
            get { return new RepositorioEventos(); }
        }

        private RepositorioLocalidades RepositorioLocalidades
        {
            get { return new RepositorioLocalidades(); }
        }

        private RepositorioBarrios RepositorioBarrios
        {
            get { return new RepositorioBarrios(); }
        }

        private RepositorioPermisos RepositorioPermisos
        {
            get { return new RepositorioPermisos(); }
        }

        private RepositorioUsuarios RepositorioUsuarios
        {
            get { return new RepositorioUsuarios(); }
        }

        private RepositorioRegistros RepositorioRegistros
        {
            get { return new RepositorioRegistros(); }
        }

        private RepositorioClientes RepositorioClientes
        {
            get { return new RepositorioClientes(); }
        }

        private RepositorioProveedores RepositorioProveedores
        {
            get { return new RepositorioProveedores(); }
        }

        private RepositorioVendedores RepositorioVendedores
        {
            get { return new RepositorioVendedores(); }
        }

        #endregion

        #region Metodos

        private void CargarFiltrarLista()
        {
            listado = RepositorioBarrios.DevolverTodos();
            Filtrar();
        }

        public void Inicializar()
        {
            vista.ListadoBarrios = listado = RepositorioBarrios.DevolverTodos();
        }

        public void Eliminar()
        {
            var usuario = RepositorioUsuarios.DevolverPorId(vista.IdUsuarioSistema);
            if (usuario == null)
                throw new Exception("El usuario no existe");
            if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.BarriosBaja))
                throw new Exception("Permisos insuficientes");

            var barrio = RepositorioBarrios.DevolverPorId(vista.IdBarrio);
            if (barrio == null)
                throw new Exception("El barrio no existe");

            var barrioPredeterminado = RepositorioBarrios.DevolverPorId((Int32)EnumBarrios.NoEspecificado);
            if (barrioPredeterminado == null)
                throw new Exception("El barrio predeterminado no existe");

            var registro = new Registro();
            registro.Usuario = usuario;
            registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.BarriosBaja);
            if (registro.Evento == null)
                throw new Exception("El evento no existe");

            RepositorioVendedores.ModificarBarrioEnDomicilios(barrioPredeterminado, barrio);
            RepositorioProveedores.ModificarBarrioEnDomicilios(barrioPredeterminado, barrio);
            RepositorioClientes.ModificarBarrioEnDomicilios(barrioPredeterminado, barrio);
            RepositorioBarrios.Eliminar(barrio);
            RepositorioRegistros.Insertar(registro);

            CargarFiltrarLista();
        }

        public void Actualizar()
        {
            CargarFiltrarLista();
        }

        public void Filtrar()
        {
            var consulta = (from item in listado
                            where item.Nombre.Trim().ToLower().Contains(vista.NombreFiltro.Trim().ToLower())
                            & item.Localidad.Id == (vista.IdLocalidadFiltro == (Int32)EnumLocalidades.Todos ? item.Localidad.Id : vista.IdLocalidadFiltro)
                            & item.TieneObservaciones == (vista.ObservacionesFiltro == EnumSiNo.Todos ? item.TieneObservaciones : (vista.ObservacionesFiltro == EnumSiNo.Si ? true : false))
                            select item).ToList();
            vista.ListadoBarrios = consulta;
        }

        public void Aceptar()
        {
            var usuario = RepositorioUsuarios.DevolverPorId(vista.IdUsuarioSistema);
            if (usuario == null)
                throw new Exception("El usuario no existe");
            if (vista.IdBarrio == 0)
            {
                if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.BarriosAlta))
                    throw new Exception("Permisos insuficientes");
            }
            else if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.BarriosModificacion))
                throw new Exception("Permisos insuficientes");

            if (String.IsNullOrWhiteSpace(vista.Nombre))
                throw new Exception("El nombre no puede quedar vacío");
            if (vista.IdLocalidad == 0)
                throw new Exception("La localidad no puede quedar vacía");
            Barrio barrio;
            if (vista.IdBarrio != 0)
            {
                barrio = RepositorioBarrios.DevolverPorId(vista.IdBarrio);
                if (barrio == null)
                    throw new Exception("El barrio no existe");
            }
            else
                barrio = new Barrio();

            barrio.Nombre = vista.Nombre.Trim();
            barrio.Observaciones = vista.Observaciones.Trim();
            barrio.Localidad = RepositorioLocalidades.DevolverPorId(vista.IdLocalidad);
            if (barrio.Localidad == null)
                throw new Exception("La localidad no existe");

            var registro = new Registro();
            registro.Usuario = usuario;
            if (vista.IdBarrio == 0)
                registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.BarriosAlta);
            else
                registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.BarriosModificacion);
            if (registro.Evento == null)
                throw new Exception("El evento no existe");

            if (vista.IdBarrio == 0)
                RepositorioBarrios.Insertar(barrio);
            else
                RepositorioBarrios.Modificar(barrio);
            RepositorioRegistros.Insertar(registro);

            CargarFiltrarLista();
        }

        #endregion
    }
}
